<?php
/**
 * Клас экспортирует импортирует данные с базы проекта.
 * База уже должна сущестовать в базе данных.
 * 
 * @todo создать тесты.
 * Класс при работе с mysql использует mysqldump
 * При работе с другими серверами нужно писать свои адаптеры.
 * @author nrnwest@gmail.com
 *
 */
class Arm_Db_Dump
{
    /**
     * 
     * @var Zend_Db_Adapter_Pdo_Mysql
     */
    private $_db;

    /**
     * Конфиг для соединения с базой данных.
     * 
     * @var strign
     */
    private $_config;
    
    /**
     * Обьект плагина
     * 
     * @var Arm_Db_Dump_Plugin_Mysql
     */
    private $_plugin;
    
    public function __construct(Zend_Db_Adapter_Abstract $db = null)
    {
        if($db === null) {
            $db = Arm_Db::getAdapter();
        }
        $this->_db = $db;
        $this->_config = $db->getConfig();
        $this->_plugin = $this->_getPlugin();
    }
    
    
    /**
     * Импортируем дамп в базу данных
     * 
     * @param string $pathFile
     */
    public function import($pathFile)
    {
        if(is_file($pathFile) === false) {
            throw new Arm_Db_Exception(Arm_Translate::_('Система не может прочитать файл "%s"', $pathFile));
        }
        return $this->_plugin->import($pathFile);
    }
    
    /**
     * Записывает дамп базы данных проекта в файл.
     * application/modules/install/db/mysql/base_name.sql
     * 
     * 
     * @return path
     */
    public function export()
    {
       $pathFile = $this->_createPathFileDump('install', $this->_config['dbname']);
       $this->_createDir($pathFile);
       $this->_plugin->exportDatabase($pathFile);
       return $pathFile;
    }
    
    /**
     * Запись дампа модуля
     * 
     * @param unknown_type $module
     * @return path
     */
    public function exportTablesModule($module)
    {
         $pathFile = $this->_createPathFileDump($module, $module);
         $this->_createDir($pathFile);
         $this->_plugin->exportTablesModule($module, $pathFile);
         return $pathFile;
    }
    
    /**
     * Проверка существования директории, и ее создания если нужно.
     * @param path $pathFile
     */
    protected function _createDir($pathFile)
    {
        $dir = rtrim(dirname($pathFile), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
        if (is_dir($dir) === false) {
            mkdir($dir, 0700, true);
        }
        return;   
    }
    
    /**
     * Создает файл для дампа, если файл существует создается файл с текущей датой.
     * @param string $module имя модуля куда записываем дамп
     * @param string $nameFile имя файла.
     */
    protected function _createPathFileDump($module, $nameFile)
    {
        $pathFile = Arm_Core::getPathModule($module) . 'install/db/';
        // тип сервера
        $server = strtolower(Arm_Db::getTypeServer($this->_db));
        $pathFile .= $server . DIRECTORY_SEPARATOR . $nameFile . '.sql';
        // проверяем если есть файл добавляем к создаваему файлу версию, или дату.
        if(is_file($pathFile) === true) {
            // добавляем дату
            $base     =  basename($pathFile);
            $baseNew  =  date("Y_m_d_H_i_s_", time()) . $base;
            $pathFile = str_replace($base, $baseNew, $pathFile);
         }
         return $pathFile;
    }
    
    
    /**
     * Arm_Db_Dump_Plugin_Mysql
     * 
     * @return Arm_Db_Dump_Plugin_Mysql
     */
    protected function _getPlugin()
    {
       $server = ucfirst(strtolower(Arm_Db::getTypeServer($this->_db)));
       $class = 'Arm_Db_Dump_Plugin_' . $server;
       return new $class($this->_db); 
    }
}